package edu.ivanov.apm.ui;

import edu.ivanov.apm.chaos.Position;
import edu.ivanov.apm.chaos.Turtle;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;

/**
 * Черепашка, рисующая на канве.
 *
 * User: Илья
 * Date: 12.10.13
 * Time: 23:15
 */
public class PaintingTurtle extends Turtle {

	private static final Color DEFAULT_COLOR = Color.BLACK;
	private static final double DEFAULT_LINE_WIDTH = 1.0;

	private Canvas canvas;
	private double width;
	private double height;
	private GraphicsContext context;

	public PaintingTurtle(Canvas canvas) {
		if (canvas == null)
			throw new RuntimeException("Не задана канва для рисующей черепашки");

		this.canvas = canvas;
		width = canvas.getWidth();
		height = canvas.getHeight();
		context = canvas.getGraphicsContext2D();

		context.setStroke(DEFAULT_COLOR);
		context.setLineWidth(DEFAULT_LINE_WIDTH);
	}

	/**
	 * @param drawColor Цвет, которым рисует черепашка.
	 * По умолчанию чёрный.
	 */
	public void setDrawColor(Color drawColor) {
		if (canvas == null)
			return;
		if (drawColor == null)
			throw new RuntimeException("Невозможно установаить цвет, которым рисует черепашка");

		context.setStroke(drawColor);
	}

	/**
	 * @param lineWidth Ширина линии, которую рисует черепашка.
	 * По умолчанию 1.
	 */
	public void setLineWidth(double lineWidth) {
		if (canvas == null)
			return;
		if (lineWidth <= 0)
			throw new RuntimeException("Невозможно установить ширину линии, которую рисует черепашка");

		context.setLineWidth(lineWidth);
	}

	protected void moved(Position oldPosition, Position newPosition, Turtle.Motion motion) {
		checkBounds(newPosition);

		if (motion != Turtle.Motion.GO)
			return;

		context.beginPath();
		context.moveTo(oldPosition.getX(), oldPosition.getY());
		context.lineTo(newPosition.getX(), newPosition.getY());
		context.stroke();
	}

	private void checkBounds(Position position) {
		if (position.getX() < 0 ||
			position.getX() > width ||
			position.getY() < 0 ||
			position.getY() > height)
			throw new RuntimeException("Точка находится за границами канвы");
	}
}
